package com.atguigu.jxc.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.service.GoodsTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * @author huangxin
 * @description
 * @date 2020/12/3
 */
@Service
public class GoodsTypeServiceImpl implements GoodsTypeService {
    
    @Autowired
    private GoodsTypeDao goodsTypeDao;

    @Override
    public List<JSONObject> getGoodsCategory() {
        // 获取全部分类
        List<GoodsType> allCategoryList = goodsTypeDao.getGoodsCategory();
        // 制作断言Map，用来判断这个分类有没有子分类
        Map<Integer, String> predicatedMap = createPredicatedMap(allCategoryList);
        // 根节点的父节点是-1，传入-1
        return getNLevelList(-1, allCategoryList, predicatedMap);
    }

    @Override
    public Map<Integer, String> createPredicatedMap(List<GoodsType> allCategoryList) {
        Map<Integer, String> predicatedMap = new HashMap<>();
        for (GoodsType goodsType : allCategoryList) {
            predicatedMap.put(goodsType.getPId(), "");
        }
        return predicatedMap;
    }
    
    @Transactional
    @Override
    public void addCategory(String goodsTypeName, Integer pId) {
        // 更新父节点
        goodsTypeDao.updateCategoryState(pId, 1);
        // 插入新节点
        goodsTypeDao.insertCategory(goodsTypeName, pId);
    }

    @Transactional
    @Override
    public void deleteCategory(Integer goodsTypeId) {
        // 获得这个分类节点
        GoodsType goodsType = goodsTypeDao.getCategoryById(goodsTypeId);
        // 获取这个分类的pid
        Integer pId = goodsType.getPId();
        // 获取全部分类
        List<GoodsType> allCategoryList = goodsTypeDao.getGoodsCategory();
        // 这个pid下有几个子节点
        long count = allCategoryList.stream()
                .filter(type -> type.getPId().equals(pId))
                .count();
        if (count == 1) { // 将父节点的状态置为没有子节点的状态
            goodsTypeDao.updateCategoryState(pId, 0);
        }
        goodsTypeDao.deleteCategory(goodsTypeId);
    }

    private List<JSONObject> getNLevelList(int pid, List<GoodsType> allCategoryList, Map<Integer, String> predicatedMap) {
        return allCategoryList.stream()
                .filter(goodsType -> goodsType.getPId() == pid)
                .map(goodsType -> {
                    JSONObject jsonObject = new JSONObject();
                    Integer goodsTypeId = goodsType.getGoodsTypeId();
                    Integer goodsTypeState = goodsType.getGoodsTypeState();
                    jsonObject.put("id", goodsTypeId);
                    jsonObject.put("text", goodsType.getGoodsTypeName());
                    jsonObject.put("iconCls", "goods-type");
                    JSONObject innerJsonObject = new JSONObject();
                    innerJsonObject.put("state", goodsTypeState);
                    jsonObject.put("attributes", innerJsonObject);
                    if (Objects.nonNull(predicatedMap.get(goodsTypeId))) { // 非叶子
                        jsonObject.put("state", "closed");
                        jsonObject.put("children", getNLevelList(goodsTypeId, allCategoryList, predicatedMap));
                    } else { // 叶子
                        jsonObject.put("state", "open");
                    }
                    return jsonObject;
                })
                .collect(Collectors.toList());
    }
}
